package com.king.service;

import com.google.gson.JsonObject;
import com.king.config.GlobalConst;
import com.king.utils.CommonUtils;
import com.king.utils.WxUtils;

import java.io.File;
import java.util.Map;

/**
 * 素材管理：
 * 1.临时素材
 * 1)、临时素材media_id是可复用的。
 * 2)、媒体文件在微信后台保存时间为3天，即3天后media_id失效。
 * 3)、上传临时素材的格式、大小限制与公众平台官网一致。
 * 图片（image）: 10M，支持PNG\JPEG\JPG\GIF格式
 * 语音（voice）：2M，播放长度不超过60s，支持AMR\MP3格式
 * 视频（video）：10MB，支持MP4格式
 * 缩略图（thumb）：64KB，支持JPG格式
 * 4)、需使用https调用本接口。
 *
 * 2.永久素材
 *
 */
public class WxMediaService {

    private static final String API_UPLOAD_TEMP_MEDIA = GlobalConst.getConfig("API_UPLOAD_TEMP_MEDIA");
    private static final String API_DOWNLOAD_TEMP_MEDIA = GlobalConst.getConfig("API_DOWNLOAD_TEMP_MEDIA");

    /**
     * 新增临时素材（即上传临时多媒体文件
     *
     * http请求方式：POST/FORM，使用https
     * https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE
     * 调用示例（使用curl命令，用FORM表单方式上传一个多媒体文件）：
     * curl -F media=@test.jpg "https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE"
     * 参数	是否必须	说明
     * access_token	是	调用接口凭证
     * type	是	媒体文件类型，分别有图片（image）、语音（voice）、视频（video）和缩略图（thumb）
     * media	是	form-data中媒体文件标识，有filename、filelength、content-type等信息
     *
     * 正确情况下的返回JSON数据包结果如下：
     * {"type":"TYPE","media_id":"MEDIA_ID","created_at":123456789}
     * 参数	描述
     * type	媒体文件类型，分别有图片（image）、语音（voice）、视频（video）和缩略图（thumb，主要用于视频与音乐格式的缩略图）
     * media_id	媒体文件上传后，获取标识
     * created_at	媒体文件上传时间戳
     *
     * 错误情况下的返回JSON数据包示例如下（示例为无效媒体类型错误）：
     * {"errcode":40004,"errmsg":"invalid media type"}
     *
     * @param data
     * @return
     */
    public JsonObject addTempMedia(Map<String,String> data){
        String filePath = data.get("filePath");
        String mediaType = data.get("mediaType");
        String url = API_UPLOAD_TEMP_MEDIA.replace("ACCESS_TOKEN",WxTokenService.getAccessToken()).replace("TYPE",mediaType);
//        String result = CommonUtils.uploadFile(url,filePath);
        String result = WxUtils.uploadMedia(url,new File(filePath));
        JsonObject jsonObject = GlobalConst.gson.fromJson(result, JsonObject.class);
        return jsonObject;
    }

    /**
     * 获取临时素材（即下载临时的多媒体文件）
     *
     * http请求方式: GET,https调用
     * https://api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID
     * 请求示例（示例为通过curl命令获取多媒体文件）
     * curl -I -G "https://api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID"
     *
     * 参数	是否必须	说明
     * access_token	是	调用接口凭证
     * media_id	是	媒体文件ID
     *
     * 正确情况下的返回HTTP头如下：
     * HTTP/1.1 200 OK
     * Connection: close
     * Content-Type: image/jpeg
     * Content-disposition: attachment; filename="MEDIA_ID.jpg"
     * Date: Sun, 06 Jan 2013 10:20:18 GMT
     * Cache-Control: no-cache, must-revalidate
     * Content-Length: 339721
     * curl -G "https://api.weixin.qq.com/cgi-bin/media/get?access_token=ACCESS_TOKEN&media_id=MEDIA_ID"
     *
     * 如果返回的是视频消息素材，则内容如下：
     * {
     *  "video_url":DOWN_URL
     * }
     *
     * 错误情况下的返回JSON数据包示例如下（示例为无效媒体ID错误）：
     * {"errcode":40007,"errmsg":"invalid media_id"}
     *
     * @return
     */
    public String getTempMedia(String mediaId,String saveFolder){
        try {
            String url = API_DOWNLOAD_TEMP_MEDIA.replace("ACCESS_TOKEN",WxTokenService.getAccessToken()).replace("MEDIA_ID",mediaId);
            File file = WxUtils.downloadMedia(url, saveFolder);
            if(file!=null){
                return file.getPath();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }
}
